把 LLM 帶進程式後,難道對 LLM 的操作就結束了嗎?Part 1 說明完「如何與 LLM 交流」,從今天開始進入 Part 2。「如何提升 LLM 回應的品質」,將是本章節的焦點。
談到提升品質,很多人直覺會想到換上參數更大、能力更好的模型,或者是搜集資料做微調(fine-tune),但事實上並不是所有使用者都能負擔升級的成本。在有限的資源下,透過系統化的 prompt 設計與工程化技巧,不花錢升級模型,也能榨出模型潛藏的能力與應有的穩定度,這就是 Prompt Engineering 要做的。
回頭看 Day 2 那支最小範例,messages 陣列裡每個元素都有一個 role。目前為止我們只用過 user,但完整的角色其實有三種:
assistant 訊息,一併送回去,模型才「記得」前面說過什麼——它本身沒有記憶,每次呼叫都是全新的。很多人第一次寫 prompt 會把所有東西都塞進 user 訊息裡,例如「你是一個客服助理,只能用繁體中文回答,語氣要親切,現在請回答:退貨政策是什麼」。這樣能動沒錯,但有個問題:如果同一個對話裡使用者問了三個問題,就得在每一句話前面重複貼一次「你是客服助理⋯⋯」這段設定。
把「角色設定、規則」放進 system,把「這次實際要問的事」放進 user,是比較乾淨的做法——system 只需要設定一次,之後每一輪對話都自動套用,不用重複貼。
import os
import anthropic
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system="你是一個客服助理,只能用繁體中文回答,語氣親切、簡潔。",
messages=[
{"role": "user", "content": "退貨政策是什麼?"},
{"role": "assistant", "content": "商品到貨 7 天內可以申請退貨,商品需保持全新未拆封狀態。"},
{"role": "user", "content": "那運費誰付?"},
],
)
print(response.content[0].text)
這裡的 messages 陣列裡放了一輪完整的「歷史」——使用者問過的話跟模型回過的話都在,最後才加上這次新的問題。模型會根據這整段歷史來回答「那運費誰付」,而不是把它當成一個孤立的問題。
值得一提的是,system 在 Anthropic 的 SDK 裡是一個獨立參數,不是塞進 messages 陣列裡的;有些廠商的 SDK(例如 OpenAI)則是把 system 也當成 messages 裡的一個角色({"role": "system", "content": "..."})。
透過 Prompt 中的結構來設定角色,是最簡單規範模型的做法。已經了解最基本 Prompt 設定後,明天我們要來探討:給模型看過範例再做,跟讓它直接做,結果會差多少?